<?php

/* how to use *
 * The first example below will load a file named picture.jpg resize it to 250 pixels wide and 400 pixels high and resave it as picture2.jpg

  <?php
  include('SimpleImage.php');
  $image = new SimpleImage();
  $image->load('picture.jpg');
  $image->resize(250,400);
  $image->save('picture2.jpg');
  ?>

  If you want to resize to a specifed width but keep the dimensions ratio the same then the script can work out the required height for you, just use the resizeToWidth function.

  <?php
  include('SimpleImage.php');
  $image = new SimpleImage();
  $image->load('picture.jpg');
  $image->resizeToWidth(250);
  $image->save('picture2.jpg');
  ?>

  You may wish to scale an image to a specified percentage like the following which will resize the image to 50% of its original width and height

  <?php
  include('SimpleImage.php');
  $image = new SimpleImage();
  $image->load('picture.jpg');
  $image->scale(50);
  $image->save('picture2.jpg');
  ?>

  You can of course do more than one thing at once. The following example will create two new images with heights of 200 pixels and 500 pixels

  <?php
  include('SimpleImage.php');
  $image = new SimpleImage();
  $image->load('picture.jpg');
  $image->resizeToHeight(500);
  $image->save('picture2.jpg');
  $image->resizeToHeight(200);
  $image->save('picture3.jpg');
  ?>

  The output function lets you output the image straight to the browser without having to save the file. Its useful for on the fly thumbnail generation

  <?php
  header('Content-Type: image/jpeg');
  include('SimpleImage.php');
  $image = new SimpleImage();
  $image->load('picture.jpg');
  $image->resizeToWidth(150);
  $image->output();
  ?>

  The following example will resize and save an image which has been uploaded via a form

  <?php
  if( isset($_POST['submit']) ) {
  include('SimpleImage.php');
  $image = new SimpleImage();
  $image->load($_FILES['uploaded_image']['tmp_name']);
  $image->resizeToWidth(150);
  $image->output();
  } else {
  ?>

  <form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="file" name="uploaded_image" />
  <input type="submit" name="submit" value="Upload" />
  </form>
 */

class SimpleImage {

    private $image;
    private $image_type;

    public function load($filename) {
        $image_info = getimagesize($filename);
        $this->image_type = $image_info[2];
        if ($this->image_type == IMAGETYPE_JPEG) {
            $this->image = imagecreatefromjpeg($filename);
        } elseif ($this->image_type == IMAGETYPE_GIF) {
            $this->image = imagecreatefromgif($filename);
        } elseif ($this->image_type == IMAGETYPE_PNG) {
            $this->image = imagecreatefrompng($filename);
        }
    }

    public function save($filename, $image_type=IMAGETYPE_JPEG, $compression=95, $permissions = null) {
        if ($image_type == IMAGETYPE_JPEG) {
            imagejpeg($this->image, $filename, $compression);
        } elseif ($image_type == IMAGETYPE_GIF) {
            imagegif($this->image, $filename);
        } elseif ($image_type == IMAGETYPE_PNG) {
            imagepng($this->image, $filename);
        }
        if ($permissions != null) {
            chmod($filename, $permissions);
        }
    }

    public function output($image_type=IMAGETYPE_JPEG) {
        if ($image_type == IMAGETYPE_JPEG) {
            return imagejpeg($this->image);
        } elseif ($image_type == IMAGETYPE_GIF) {
            return imagegif($this->image);
        } elseif ($image_type == IMAGETYPE_PNG) {
            return imagepng($this->image);
        }
    }

    public function getWidth() {
        return imagesx($this->image);
    }

    public function getHeight() {
        return imagesy($this->image);
    }

    public function resizeToHeight($height) {
        $ratio = $height / $this->getHeight();
        $width = $this->getWidth() * $ratio;
        $this->resize($width, $height);
    }

    public function resizeToWidth($width) {
        $ratio = $width / $this->getWidth();
        $height = $this->getheight() * $ratio;
        $this->resize($width, $height);
    }

    public function scale($scale) {
        $width = $this->getWidth() * $scale / 100;
        $height = $this->getheight() * $scale / 100;
        $this->resize($width, $height);
    }

    public function resize($width, $height, $crop = false) {
        $new_image = imagecreatetruecolor($width, $height);

        $calculated_height = $height;
        $calculated_width = $width;
        
        if ($crop) {
            $calculated_height = ($this->getHeight() / $this->getWidth()) * $width;
            if ($calculated_height < $height) {
                $calculated_height = $height;
                $calculated_width = ($this->getWidth() / $this->getHeight()) * $height;
            }
        }

        imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $calculated_width, $calculated_height, $this->getWidth(), $this->getHeight());

        $this->image = $new_image;
    }

}